/**
 * 企业微信登录助手
 * 提供企业微信环境下的登录和授权处理
 */

// 尝试导入相关模块
const logHelper = require('../../../helpers/log_helper.js');

/**
 * 检查当前环境是否为企业微信环境
 * @return {Boolean} 是否为企业微信环境
 */
function isInWxworkEnv() {
  return new Promise((resolve) => {
    try {
      // 检查是否在企业微信环境中
      wx.getSystemInfo({
        success(res) {
          resolve(res.environment === 'wxwork');
        },
        fail() {
          resolve(false);
        }
      });
    } catch (e) {
      logHelper.logError(e, '检查企业微信环境失败');
      resolve(false);
    }
  });
}

/**
 * 获取企业微信授权code
 * @return {Promise<String>} 授权code
 */
function getQyWxCode() {
  return new Promise((resolve, reject) => {
    if (!isInWxworkEnv()) {
      reject(new Error('当前不在企业微信环境中'));
      return;
    }
    
    wx.qy.login({
      success: (res) => {
        if (res.code) {
          resolve(res.code);
        } else {
          reject(new Error('获取企业微信授权码失败'));
        }
      },
      fail: (err) => {
        logHelper.logError(err, '企业微信登录失败');
        reject(err);
      }
    });
  });
}

/**
 * 执行企业微信登录过程
 * @param {Object} options 登录选项
 * @param {String} options.agentId 应用ID
 * @param {Function} options.onSuccess 登录成功回调
 * @param {Function} options.onFail 登录失败回调
 * @param {Number} options.maxRetries 最大重试次数
 * @return {Promise<Object>} 登录结果
 */
async function doQyWxLogin(options = {}) {
  const defaultOptions = {
    agentId: '',
    maxRetries: 3,
    onSuccess: null,
    onFail: null
  };
  
  const opts = {...defaultOptions, ...options};
  let retryCount = 0;
  
  // 开始登录过程
  const startLogin = async () => {
    try {
      // 获取企业微信授权code
      const code = await getQyWxCode();
      
      // 调用后端接口登录
      const res = await wx.cloud.callFunction({
        name: 'passport',
        data: {
          action: 'qyLoginByCode',
          code: code,
          agentId: opts.agentId
        }
      });
      
      // 处理登录结果
      if (res.result && res.result.code === 200) {
        // 登录成功
        logHelper.logEvent('qyWxLoginSuccess', { agentId: opts.agentId });
        
        // 保存登录状态和token
        wx.setStorageSync('TOKEN', res.result.data.token);
        wx.setStorageSync('QYWX_LOGIN_TIME', Date.now());
        
        // 调用成功回调
        if (typeof opts.onSuccess === 'function') {
          opts.onSuccess(res.result.data);
        }
        
        return res.result.data;
      } else {
        throw new Error(res.result?.msg || '企业微信登录失败');
      }
    } catch (err) {
      logHelper.logError(err, '企业微信登录出错');
      
      // 判断是否需要重试
      if (retryCount < opts.maxRetries) {
        retryCount++;
        logHelper.logEvent('qyWxLoginRetry', { retryCount });
        
        // 延迟重试
        await new Promise(resolve => setTimeout(resolve, 1000));
        return startLogin(); // 递归重试
      } else {
        // 重试次数用完，登录失败
        if (typeof opts.onFail === 'function') {
          opts.onFail(err);
        }
        throw err;
      }
    }
  };
  
  return startLogin();
}

/**
 * 检查企业微信登录状态
 * @return {Boolean} 是否已登录
 */
function checkQyWxLoginStatus() {
  const token = wx.getStorageSync('TOKEN');
  const loginTime = wx.getStorageSync('QYWX_LOGIN_TIME');
  
  if (!token || !loginTime) {
    return false;
  }
  
  // 检查登录是否过期（默认24小时）
  const now = Date.now();
  const expireTime = 24 * 60 * 60 * 1000; // 24小时
  
  return (now - loginTime) < expireTime;
}

/**
 * 退出企业微信登录
 */
function qyWxLogout() {
  wx.removeStorageSync('TOKEN');
  wx.removeStorageSync('QYWX_LOGIN_TIME');
  logHelper.logEvent('qyWxLogout');
}

// 导出模块
module.exports = {
  isInWxworkEnv,
  getQyWxCode,
  doQyWxLogin,
  checkQyWxLoginStatus,
  qyWxLogout
}; 